#include "NivelPriorizacion.h"

/* =============================================================================
 * Declaracion Atributos privados
 * =============================================================================
 */
struct NivelPriorizacion {
    int nivel;
    tLista trabajos;
};

typedef struct NivelPriorizacion* _tNivelPriorizacion;

/*==============================================================================
 * Definicion de metodos publicos
 *==============================================================================
 */

void nivelPriorizacionCrear (tNivelPriorizacion* pNivelPriorizacion, int pNivel){

    _tNivelPriorizacion nivel = NULL;
    
    if (pNivelPriorizacion)
    {
        nivel = (_tNivelPriorizacion) malloc (sizeof (struct NivelPriorizacion));
        if (nivel)
        {
            nivel->nivel = pNivel;
            listaCrear(&(nivel->trabajos), &trabajoDestruir);
        }
    }
    
    *pNivelPriorizacion = nivel;
}

//------------------------------------------------------------------------------

int nivelPriorizacionDestruir (tNivelPriorizacion pNivelPriorizacion){
    
    int val = DATO_ERROR;
    _tNivelPriorizacion nivel = (_tNivelPriorizacion) pNivelPriorizacion;
    
    if (pNivelPriorizacion)
    {
        listaDestruir(nivelPriorizacionGetTrabajos(pNivelPriorizacion));
        free (nivel);
        
        val = DATO_OK;
    }
    return val;
}

//------------------------------------------------------------------------------

int nivelPriorizacionComparar (tNivelPriorizacion pNivelA, tNivelPriorizacion pNivelB) {
    int comparacion = 0;
    
    if (nivelPriorizacionGetNivel(pNivelA) > nivelPriorizacionGetNivel(pNivelB))
        comparacion = 1;
    else if (nivelPriorizacionGetNivel(pNivelA) < nivelPriorizacionGetNivel(pNivelB))
        comparacion = -1;
    else
        comparacion = 0;
    
    return comparacion;
}

//------------------------------------------------------------------------------

void nivelPriorizacionAgregar (tNivelPriorizacion pNivelPriorizacion, tTrabajo pTrabajo){
    
    if (pNivelPriorizacion && pTrabajo)
        if ( nivelPriorizacionGetNivel(pNivelPriorizacion) == trabajoGetPrioridad(pTrabajo))
            listaAgregarFinal(nivelPriorizacionGetTrabajos(pNivelPriorizacion), pTrabajo);
}

//------------------------------------------------------------------------------

void nivelPriorizacionRemover (tNivelPriorizacion pNivelPriorizacion, tTrabajo pTrabajo){
    
    if (pNivelPriorizacion && pTrabajo)
        listaRemover(nivelPriorizacionGetTrabajos(pNivelPriorizacion), pTrabajo);
}

//------------------------------------------------------------------------------

tTrabajo nivelPriorizacionPrimero (tNivelPriorizacion pNivelPriorizacion){
    
    tTrabajo trabajo = NULL;
    
    if (pNivelPriorizacion)
        trabajo = listaObtenerPrimero(nivelPriorizacionGetTrabajos(pNivelPriorizacion));
    
    return trabajo;
}

//------------------------------------------------------------------------------

tTrabajo nivelPriorizacionSiguiente (tNivelPriorizacion pNivelPriorizacion, tTrabajo pTrabajo){
    tLista trabajos = nivelPriorizacionGetTrabajos(pNivelPriorizacion);
    return (tTrabajo) listaObtenerSiguiente(trabajos, pTrabajo);
}

//------------------------------------------------------------------------------

int nivelPriorizacionGetNivel (tNivelPriorizacion pNivelPriorizacion){
    int val = -1;
    
    if (pNivelPriorizacion)
        val = ((_tNivelPriorizacion) pNivelPriorizacion)->nivel;
    
    return val;
}

//------------------------------------------------------------------------------

tLista nivelPriorizacionGetTrabajos(tNivelPriorizacion pNivelPriorizacion) {

    tLista trabajos = NULL;
    
    if (pNivelPriorizacion)
        trabajos = ((_tNivelPriorizacion)pNivelPriorizacion)->trabajos;
    
    return trabajos;
}

tBool nivelPriorizacionVacio (tNivelPriorizacion pNivelPriorizacion) {
    return listaVacia(nivelPriorizacionGetTrabajos(pNivelPriorizacion));
}

